package com.levy.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.levy.dao.LoginLogDao;
import com.levy.dao.UserDao;
import com.levy.domain.LoginLog;
import com.levy.domain.User;

/**
 * UserService业务类，负责将持久层的UserDao和LoginLogDao组织起来
 * 完成用户/密码认证、登录日志记录等操作
 *
 * @author liwei515
 */
@Service  // 将UserService标注为一个服务层的Bean
public class UserService {

  private UserDao userDao;

  private LoginLogDao loginLogDao;

  /**
   * set方法注入UserDao的Bean
   *
   * @param userDao 用户数据访问对象
   */
  @Autowired
  public void setUserDao(UserDao userDao) {
    this.userDao = userDao;
  }

  /**
   * set方法注入LoginLogDao的Bean
   *
   * @param loginLogDao 用户登录日志数据访问对象
   */
  @Autowired
  public  void setLoginLogDao(LoginLogDao loginLogDao) {
    this.loginLogDao = loginLogDao;
  }

  /**
   * 检查用户名/密码的正确性
   *
   * @param userName 用户名
   * @param password 密码
   * @return 匹配结果Boolean
   */
  public boolean hasMatchUser(String userName, String password) {
    int matchCount = userDao.getMatchCount(userName, password);
    return matchCount > 0;
  }

  /**
   * 以用户名为条件加载User对象
   *
   * @param userName 用户名
   * @return User对象
   */
  public User findUserByUserName(String userName) {
    return userDao.findUserByUserName(userName);
  }

  /**
   * 在用户登录成功后调用，更新用户最后登录时间和IP信息，同时记录用户登录日志
   * Transactional事务注解：让该方法运行在事务环境中，（在Spring事务管理器拦截切入表达式加入@Transactional注解）
   *
   * @param user User对象
   */
  @Transactional
  public void loginSuccess(User user) {
    user.setCredits( 5 + user.getCredits());
    LoginLog loginLog = new LoginLog();
    loginLog.setUserId(user.getUserId());
    loginLog.setLoginDate(user.getLastVisit());
    loginLog.setIp(user.getLastIp());
    userDao.updateLoginInfo(user);
    loginLogDao.insertLoginLog(loginLog);
  }
}
